package com.ruoyi.combat.util;

import org.springframework.stereotype.Component;

@Component
public class CoordinateUtils {

    /**
     * 地球半径
     */

    private static final double EARTH_RADIUS_KM = 6371.0;

    /**
     * 计算两个点之间的距离
     *
     * @param x1 第一个点的x坐标
     * @param y1 第一个点的y坐标
     * @param x2 第二个点的x坐标
     * @param y2 第二个点的y坐标
     * @return 返回两点之间的距离
     */
    public static double calculateDistance(double x1, double y1, double x2, double y2) {
        return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
    }

    /**
     * 计算两个点之间的距离
     *
     * @param x1 第一个点的x坐标
     * @param y1 第一个点的y坐标
     * @param x2 第二个点的x坐标
     * @param y2 第二个点的y坐标
     * @return 返回两点之间的距离
     */
    public static double calculateDistance(float x1, float y1, float x2, float y2) {
        return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
    }


    /**
     * Haversine 公式计算距离
     *
     * @param lat1 纬度 1
     * @param lon1 经度 1
     * @param lat2 纬度 2
     * @param lon2 经度 2
     * @return 两点之间的距离(km)
     */
    public static long calculateGEODistance(double lat1, double lon1, double lat2, double lon2) {
        // 将经纬度转换为弧度
        double lat1Rad = Math.toRadians(lat1);
        double lon1Rad = Math.toRadians(lon1);
        double lat2Rad = Math.toRadians(lat2);
        double lon2Rad = Math.toRadians(lon2);
        // 计算经纬度的差值
        double deltaLat = lat2Rad - lat1Rad;
        double deltaLon = lon2Rad - lon1Rad;
        // 用 Haversine 公式计算
        double a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.pow(Math.sin(deltaLon / 2), 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double distance = EARTH_RADIUS_KM * c;
        // 取整
        return Math.round(distance);
    }

    public static void main(String[] args) {
        System.out.println(calculateGEODistance(21.15656,113.3232,21.323,113.3232));
    }
}
